﻿#pragma once

/*
参考
https://github.com/Ubpa/UDRefl
https://zhuanlan.zhihu.com/p/337200770

反射:可以在运行时获取结构体结构数据类型与字段名称,从而根据这个字段名称与类型将欲赋值的数据按对应各式写入

需要有一个注册点,记录所有类型与其反射函数
还需要一个结构点,记录所有显式反射信息(待定


*/
using namespace std;
class AbstractMethod
{
public:
	virtual void show() {}  // = 0;  // 可以是纯虚函数，这里为了测试方便不使用纯虚函数！
	void fun()
	{
		cout << "I was called!" << endl;
	}

	void fun1()
	{
		cout << "I was called!" << endl;
	}
};

int main()
{
	// 定义成员函数指针类型
	typedef void (AbstractMethod::* MFP)(void);

	// 转化函数指针为别的指针
	MFP mfp1 = &AbstractMethod::show;
	unsigned* tmp = (unsigned*)&mfp1;
	cout << hex << *tmp << endl;

	MFP mfp2 = &AbstractMethod::fun;
	tmp = (unsigned*)&mfp2;
	cout << hex << *tmp << endl;

	MFP mfp3 = &AbstractMethod::fun1;
	tmp = (unsigned*)&mfp3;
	cout << hex << *tmp << endl;

	// 通过转化后的指针调用成员函数
	AbstractMethod am;
	MFP* addr = (MFP*)tmp;
	(am.*mfp3)();
	(am.*(*addr))();

	return 0;
}